/*
 * c_bloque.h
 *
 *  Created on: 27 Apr 2010
 *      Author: osky
 */

#include "c_bloque.h"
#include "Archivo.h"
#include <stdio.h>
#include <string.h>


/* Constructor - Inicializa variables a cero */
c_bloque::c_bloque ()
    {

    largo_bloque=LARGO_BLOQUE;
    posicion=0;
    nro_de_bloque=0;
    for (unsigned int i=0; i < largo_bloque; mem_buffer[i++] = 0);
    }


/* Asigna un numero de bloque */
void c_bloque::set_nro ( unsigned int n_bloque)
    {
    nro_de_bloque=n_bloque;
    }

/* Establece la posicion donde se va a hacer la proxima lectura/escritura */
int c_bloque::set_pos (unsigned int pos)
    {
    
    int ret;
    
    if (pos<=LARGO_BLOQUE) { posicion = pos; ret=RES_OK; }
    else ret=RES_NOK;
    
    return ret;
    }

/* Devuelve el largo total del bloque */
unsigned int c_bloque::largo ()
    {
    return largo_bloque;
    }

/* Devuelve el espacio libre asignado */
unsigned int c_bloque::espacio_libre ()
    {
    return largo_bloque-posicion;
    }



/* Inserta elemento dentro del bloque */
int c_bloque::add(int valor)	/* Para insertar enteros */
    {
     int cod_return=0;
     unsigned int sizedato = sizeof (valor);

      if( (largo_bloque-posicion) >= sizedato )
        {

        #ifdef _DEBUG_
        printf (" Agregando entero: %d (ocupacion: %d ) en posicion: %d \n", valor, sizedato, posicion);
        #endif

        memmove (mem_buffer+posicion,(void*) &valor, sizedato);

        posicion+=sizedato;

        cod_return=RES_OK;
        }
      else { cod_return = RES_NOK;} 

     return cod_return;
    }


/* Lee elemeentos dentro del bloque */
int c_bloque::get (unsigned int *valor)
    {

    int cod_return=0;
    unsigned int sizedato = sizeof (*valor);

      if( (largo_bloque-posicion) >= sizedato )
        {

        memmove (valor, mem_buffer+posicion,sizedato);

        #ifdef _DEBUG_ 
        printf (" Obteniendo dato: %d  en posicion: %d \n", *valor, posicion);
        #endif	

        posicion+=sizedato;

        cod_return=RES_OK;
        }
      else  { cod_return = RES_NOK; printf ("ERROR en c_bloque.get()\n"); }

     return cod_return;

    }

int c_bloque::get (int *valor)
    {

    int cod_return=0;
    unsigned int sizedato = sizeof (*valor);

      if( (largo_bloque-posicion) >= sizedato )
        {

        memmove (valor, mem_buffer+posicion,sizedato);

        #ifdef _DEBUG_
        printf (" Obteniendo dato: %d  en posicion: %d \n", *valor, posicion);
        #endif

        posicion+=sizedato;

        cod_return=RES_OK;
        }
      else  { cod_return = RES_NOK; printf ("ERROR en c_bloque.get()\n"); }

     return cod_return;

    }



    int c_bloque::add (void *valor, unsigned int sizedato)
    {
     int cod_return=0;

      if( (largo_bloque-posicion) >= sizedato )
        {

        #ifdef _DEBUG_	
        printf (" Agregando void: %s (largo: %d ) en posicion: %d \n", (char*) valor, sizedato, posicion);
        #endif		

         memmove (mem_buffer+posicion, valor, sizedato);

        posicion+=sizedato;

        cod_return=RES_OK;
        }
      else  { cod_return = RES_NOK; printf ("ERROR en c_bloque.add()\n"); }

     return cod_return;
    }



    int c_bloque::get (void **valor, unsigned int sizedato)
    {
     int cod_return=0;

      if( (largo_bloque-posicion) >= sizedato )
        {

/*        memcpy (valor, mem_buffer+posicion, sizedato);       */

        *valor=mem_buffer+posicion;

        #ifdef _DEBUG_  
        printf (" Obteniendo void: %s (largo: %d ) en posicion: %d \n", (char*) *valor, sizedato, posicion);
        #endif	

        posicion+=sizedato;

        cod_return=RES_OK;
        }
      else  { cod_return = RES_NOK; printf ("ERROR en c_bloque.add()\n"); }

     return cod_return;
    }





    /*************************************************************/

    /*** GRABA EL BLOQUE DE MEMORIA EN UN ARCHIVO ***************/
    int c_bloque::save ()
    {

//    int resultado = 0;

    Archivo::getInstance()->write((void*)mem_buffer,nro_de_bloque);
    

    #ifdef _DEBUG_
    printf ("Escritos %d bytes en Bloque nro: %d en posicion: %ld \n",resultado,nro_de_bloque, ftell(handler));
    #endif

    return RES_OK;

    }



    int c_bloque::load ()
    {

//    int resultado=0;

    Archivo::getInstance()->read((void*)mem_buffer,nro_de_bloque);

    #ifdef _DEBUG_
    printf ("Leidos %d bytes de %d en bloque %d ferror: %d\n",bytes_leidos, largo_bloque, nro_de_bloque, ferror(handler));
    #endif

    return RES_OK;
    }


